package com.campus.food.service;

import com.campus.food.model.entity.Review;

import java.util.List;

/**
 * 评价服务接口
 * 
 * @author Claude3.7 Sonnet
 * @since 2025-05-29
 */
public interface ReviewService {
    
    /**
     * 添加评价
     * @param review 评价信息
     * @return 添加成功的评价
     */
    Review addReview(Review review);
    
    /**
     * 根据ID查询评价
     * @param id 评价ID
     * @return 评价信息
     */
    Review getReviewById(Long id);
    
    /**
     * 更新评价信息
     * @param review 评价信息
     * @return 更新结果
     */
    boolean updateReview(Review review);
    
    /**
     * 删除评价
     * @param id 评价ID
     * @param userId 用户ID（用于权限验证）
     * @return 删除结果
     */
    boolean deleteReview(Long id, Long userId);
    
    /**
     * 根据订单ID查询评价
     * @param orderId 订单ID
     * @return 评价信息
     */
    Review getReviewByOrderId(Long orderId);
    
    /**
     * 分页查询商家评价列表
     * @param merchantId 商家ID
     * @param page 页码
     * @param size 每页大小
     * @param rating 评分筛选（可选）
     * @return 评价列表
     */
    List<Review> getMerchantReviews(Long merchantId, int page, int size, Integer rating);
    
    /**
     * 查询商家评价总数
     * @param merchantId 商家ID
     * @param rating 评分筛选（可选）
     * @return 评价总数
     */
    long getMerchantReviewCount(Long merchantId, Integer rating);
    
    /**
     * 分页查询用户评价列表
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @return 评价列表
     */
    List<Review> getUserReviews(Long userId, int page, int size);
    
    /**
     * 查询用户评价总数
     * @param userId 用户ID
     * @return 评价总数
     */
    long getUserReviewCount(Long userId);
    
    /**
     * 查询商家平均评分
     * @param merchantId 商家ID
     * @return 平均评分
     */
    Double getMerchantAvgRating(Long merchantId);
    
    /**
     * 查询商家各评分等级的数量统计
     * @param merchantId 商家ID
     * @return 评分统计列表
     */
    List<Review> getMerchantRatingStats(Long merchantId);
    
    /**
     * 检查用户是否已评价订单
     * @param orderId 订单ID
     * @return 是否已评价
     */
    boolean hasReviewedOrder(Long orderId);
    
    /**
     * 批量删除评价
     * @param ids 评价ID列表
     * @param userId 用户ID（用于权限验证）
     * @return 删除结果
     */
    boolean deleteReviewsBatch(List<Long> ids, Long userId);
    
    /**
     * 获取所有评价列表（管理员专用）
     * @param page 页码
     * @param size 每页大小
     * @param userId 用户ID（可选）
     * @param merchantId 商家ID（可选）
     * @return 评价列表
     */
    List<Review> getAllReviews(int page, int size, Long userId, Long merchantId);
    
    /**
     * 更新商家评分（根据最新评价重新计算）
     * @param merchantId 商家ID
     * @return 更新结果
     */
    boolean updateMerchantRating(Long merchantId);
    
    /**
     * 获取最新评价列表
     * @param limit 数量限制
     * @return 最新评价列表
     */
    List<Review> getLatestReviews(int limit);
    
    /**
     * 获取高分评价列表
     * @param merchantId 商家ID（可选）
     * @param minRating 最低评分
     * @param limit 数量限制
     * @return 高分评价列表
     */
    List<Review> getHighRatingReviews(Long merchantId, Integer minRating, int limit);
    
    /**
     * 根据用户ID获取评价列表
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @param rating 评分筛选（可选）
     * @return 评价列表
     */
    List<Review> getReviewsByUserId(Long userId, int page, int size, Integer rating);
    
    /**
     * 根据用户ID获取评价数量
     * @param userId 用户ID
     * @param rating 评分筛选（可选）
     * @return 评价数量
     */
    long getReviewCountByUserId(Long userId, Integer rating);
    
    /**
     * 根据商家ID获取评价列表
     * @param merchantId 商家ID
     * @param page 页码
     * @param size 每页大小
     * @param rating 评分筛选（可选）
     * @return 评价列表
     */
    List<Review> getReviewsByMerchantId(Long merchantId, int page, int size, Integer rating);
    
    /**
     * 根据商家ID获取评价数量
     * @param merchantId 商家ID
     * @param rating 评分筛选（可选）
     * @return 评价数量
     */
    long getReviewCountByMerchantId(Long merchantId, Integer rating);
    
    /**
     * 商家回复评价
     * @param id 评价ID
     * @param reply 回复内容
     * @param merchantId 商家ID
     * @return 回复结果
     */
    boolean replyReview(Long id, String reply, Long merchantId);
    
    /**
     * 获取商家平均评分
     * @param merchantId 商家ID
     * @return 平均评分
     */
    Double getAverageRatingByMerchantId(Long merchantId);
    
    /**
     * 检查订单是否已评价
     * @param orderId 订单ID
     * @return 是否已评价
     */
    boolean checkReviewExists(Long orderId);
    
    /**
     * 批量删除评价（管理员专用）
     * @param ids 评价ID列表
     * @return 删除结果
     */
    boolean deleteReviewsBatch(List<Long> ids);
    
    /**
     * 获取所有评价列表（管理员专用）
     * @param page 页码
     * @param size 每页大小
     * @param userId 用户ID（可选）
     * @param merchantId 商家ID（可选）
     * @param rating 评分筛选（可选）
     * @return 评价列表
     */
    List<Review> getAllReviews(int page, int size, Long userId, Long merchantId, Integer rating);
    
    /**
     * 获取所有评价总数（管理员专用）
     * @param userId 用户ID（可选）
     * @param merchantId 商家ID（可选）
     * @param rating 评分筛选（可选）
     * @return 评价总数
     */
    long getAllReviewCount(Long userId, Long merchantId, Integer rating);
    
    /**
     * 根据评分获取评价列表
     * @param rating 评分
     * @param page 页码
     * @param size 每页大小
     * @return 评价列表
     */
    List<Review> getReviewsByRating(Integer rating, int page, int size);
    
    /**
     * 获取最新评价列表
     * @param limit 数量限制
     * @param merchantId 商家ID（可选）
     * @return 最新评价列表
     */
    List<Review> getLatestReviews(int limit, Long merchantId);
    
    /**
     * 搜索评价
     * @param keyword 关键词
     * @param page 页码
     * @param size 每页大小
     * @param merchantId 商家ID（可选）
     * @param rating 评分筛选（可选）
     * @return 评价列表
     */
    List<Review> searchReviews(String keyword, int page, int size, Long merchantId, Integer rating);
    
    /**
     * 获取有图评价列表
     * @param merchantId 商家ID
     * @param page 页码
     * @param size 每页大小
     * @return 有图评价列表
     */
    List<Review> getReviewsWithImages(Long merchantId, int page, int size);
    
    /**
     * 检查用户是否可以对订单进行评价
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否可以评价
     */
    boolean canReviewOrder(Long orderId, Long userId);
    
    /**
     * 获取商家已回复的评价数量
     * @param merchantId 商家ID
     * @return 已回复评价数量
     */
    long getRepliedReviewCount(Long merchantId);
} 